class D:

    def __init__(self, data):
        self.data = data

    # 不仅仅拦截索引跟切片的操作，获取操作也会被拦截
    def __getitem__(self, index):
        result = self.data[index]
        print(F"魔法方法__getitem__被执行，传入的index={index}，返回的结果={result}")
        return result

    # 为索引或者切片赋值操作的时候就会被 __setitem__ 魔法方法所拦截
    def __setitem__(self, index, value):
        print(F"魔法方法__setitem__被执行，传入的index={index}，value={value}")
        self.data[index] = value


d = D([1, 2, 3, 4, 5])
r_1 = d[1]
# 魔法方法__getitem__被执行，传入的index=1，返回的结果=2

print("===============================================================")

d[1] = 911
# 魔法方法__setitem__被执行，传入的index=1，value=911

print("===============================================================")

r = d[:]
# 魔法方法__getitem__被执行，传入的index=slice(None, None, None)，返回的结果=[1, 911, 3, 4, 5]
